home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2000 September / september_2000.iso / intercd / root / ^Linux / WindowMaker / src / geomview.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-14  |  3.2 KB  |  162 lines

  1.  
  2.  
  3.  
  4. #include "WINGsP.h"
  5.  
  6.  
  7.  
  8. typedef struct W_GeometryView {
  9.     W_Class widgetClass;
  10.     WMView *view;
  11.     
  12.     GC gc;
  13.     WMFont *font;
  14.     
  15.     WMSize textSize;
  16.     
  17.     union {
  18.     struct {
  19.         int x, y;
  20.     } pos;
  21.     struct {
  22.         unsigned width, height;
  23.     } size;
  24.     } data;
  25.     
  26.     unsigned showPosition:1;
  27. } WGeometryView;
  28.  
  29.  
  30.  
  31. static void handleEvents(XEvent *event, void *clientData);
  32. static void paint(WGeometryView *gview);
  33.  
  34.  
  35. WGeometryView*
  36. WCreateGeometryView(WMScreen *scr)
  37. {
  38.     WGeometryView *gview;
  39.     char buffer[64];
  40.     static W_Class widgetClass = 0;
  41.     
  42.     if (!widgetClass) {
  43.     widgetClass = W_RegisterUserWidget();
  44.     }
  45.     
  46.     gview = malloc(sizeof(WGeometryView));
  47.     if (!gview) {
  48.     return NULL;
  49.     }
  50.     memset(gview, 0, sizeof(WGeometryView));
  51.     
  52.     gview->widgetClass = widgetClass;
  53.  
  54.     gview->view = W_CreateTopView(scr);
  55.     if (!gview->view) {
  56.     free(gview);
  57.  
  58.     return NULL;
  59.     }
  60.     gview->view->self = gview;
  61.  
  62.     gview->font = WMSystemFontOfSize(scr, 12);
  63.     if (!gview->font) {
  64.     W_DestroyView(gview->view);
  65.     free(gview);
  66.  
  67.     return NULL;
  68.     }
  69.  
  70.     {
  71.     WMColor *black = WMBlackColor(scr);
  72.     WMColor *gray = WMGrayColor(scr);
  73.     XGCValues gcv;
  74.     
  75.     gcv.foreground = WMColorPixel(black);
  76.     gcv.background = WMColorPixel(gray);
  77.     
  78.     gview->gc = XCreateGC(WMScreenDisplay(scr), W_DRAWABLE(scr),
  79.                   GCForeground|GCBackground, &gcv);
  80.  
  81.     WMReleaseColor(black);
  82.     WMReleaseColor(gray);
  83.     }
  84.  
  85.     WMCreateEventHandler(gview->view, ExposureMask, handleEvents, gview);
  86.  
  87.     sprintf(buffer, "%+05i,  %+05i", 0, 0);
  88.  
  89.     gview->textSize.width = WMWidthOfString(gview->font, buffer, 
  90.                         strlen(buffer));
  91.     gview->textSize.height = WMFontHeight(gview->font);
  92.     
  93.     W_ResizeView(gview->view, gview->textSize.width+8,
  94.          gview->textSize.height+6);
  95.  
  96.     return gview;
  97. }
  98.  
  99.  
  100. void
  101. WSetGeometryViewShownPosition(WGeometryView *gview, int x, int y)
  102. {
  103.     gview->showPosition = 1;
  104.     gview->data.pos.x = x;
  105.     gview->data.pos.y = y;
  106.     
  107.     paint(gview);
  108. }
  109.  
  110.  
  111. void
  112. WSetGeometryViewShownSize(WGeometryView *gview,
  113.               unsigned width, unsigned height)
  114. {
  115.     gview->showPosition = 0;
  116.     gview->data.size.width = width;
  117.     gview->data.size.height = height;
  118.     
  119.     paint(gview);
  120. }
  121.  
  122.  
  123.  
  124. static void
  125. paint(WGeometryView *gview)
  126. {
  127.     char buffer[64];
  128.  
  129.     if (gview->showPosition) {
  130.     sprintf(buffer, "%+5i , %+5i    ", gview->data.pos.x, gview->data.pos.y);
  131.     } else {
  132.     sprintf(buffer, "%+5i x %+5i    ", gview->data.size.width, gview->data.size.height);
  133.     }
  134.  
  135.     WMDrawImageString(W_VIEW_SCREEN(gview->view),
  136.               W_VIEW_DRAWABLE(gview->view),
  137.               gview->gc, gview->font,
  138.               (W_VIEW_WIDTH(gview->view)-gview->textSize.width)/2,
  139.               (W_VIEW_HEIGHT(gview->view)-gview->textSize.height)/2,
  140.               buffer, strlen(buffer));
  141.  
  142.     W_DrawRelief(W_VIEW_SCREEN(gview->view), W_VIEW_DRAWABLE(gview->view),
  143.          0, 0, W_VIEW_WIDTH(gview->view), W_VIEW_HEIGHT(gview->view),
  144.          WRRaised);
  145. }
  146.  
  147.  
  148.  
  149. static void
  150. handleEvents(XEvent *event, void *clientData)
  151. {
  152.     WGeometryView *gview = (WGeometryView*)clientData;
  153.     
  154.     switch (event->type) {
  155.      case Expose:
  156.     paint(gview);
  157.     break;
  158.     
  159.     }
  160. }
  161.  
  162.